package com.douma._2022_6_28;

import java.util.*;

/**
 * 抖码算法，让算法学习变的简单有趣
 *
 * @作者 : 老汤
 */
public class 计算堆栈中的剩余数字 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String[] data = sc.nextLine().split(" ");
        int[] nums = new int[data.length];
        for (int i = 0; i < nums.length; i++) {
            nums[i] = Integer.valueOf(data[i]);
        }

        // 这里直接使用数组来模拟栈
        // top 表示栈顶
        int top = 1;
        // 从第二个元素开始，因为第一个元素肯定需要放到栈里的
        for (int i = 1; i < nums.length; i++) {
            // num 表示即将压入栈的元素值
            int num = nums[i];

            // 不断的判断是否存在累加和等于 num 的起始索引
            int start;
            while ((start = index(num, top, nums)) != -1) {
                num = 2 * num;
                top = start;
            }

            nums[top++] = num;
        }

        for (int i = top - 1; i >= 0; i--) {
            if (i == 0) {
                System.out.print(nums[i]);
            } else {
                System.out.print(nums[i] + " ");
            }
        }

        sc.close();
    }

    /**
     * 在 nums 中从索引 0 开始一直到 top - 1位置，看看有没有累加和等于 num 的情况
     * 如果有的话，返回起始索引
     *
     * 比如 num = 3, top = 3, nums = [6, 1, 2, 3]
     * 因为 1 + 2 = 3，所以返回 1 的索引 1
     * @param num
     * @param top
     * @param nums
     * @return
     */
    private static int index(int num, int top, int[] nums) {
        int sum = 0;
        for (int j = top - 1; j >= 0; j--) {
            sum += nums[j];
            if (sum == num) return j;
        }
        return -1;
    }
}
